package com.shujia.wyh.day13.ketang;

/*
        我们之前上课所说的一些案例，比如猫狗案例，披萨案例等等，想动物这些东西不应该是一个具体的事物，而是一个抽象的事物。
        像动物中吃或者睡，这些方法应该也不是一个具体的方法。我们就不应该把动物定义为一个具体的类而是一个抽象的类，像不具体的方法
        我们也应该定义成一个抽象的方法。

        抽象类特点
            抽象类和抽象方法必须用abstract关键字修饰
            格式
            abstract class 类名 {}
            public abstract void eat();
       注意事项：
            1、没有具体实现的方法，要被定义成抽象方法，而抽象方法是没有方法体的，连大括号都没有。
            2、如果一个类中存在抽象方法，这个类就必须是抽象类。
            3、抽象类不能被实例化
                问题：那么如何实例化使用里面的东西
                需要一个具体的类继承该抽象类，利用多态的形式来创建对象(抽象多态)
            4、具体的类继承一个抽象类就必须实现该抽象类中所有的抽象方法
            5、抽象类去继承抽象类，可以不用实现父抽象类中的抽象方法
            6、抽象类中既可以存在抽象方法，也可以存在具体的方法实现。
            7、抽象类中不一定有抽象方法，但是有抽象方法的类一定是抽象类


 */

abstract class Animal{
    public abstract void eat();
}

class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }
}

abstract class Demo extends Animal {
    @Override
    public void eat() {
        System.out.println("这是抽象Demo类中实现的eat方法");
    }
}

public class AbstractDemo1 {
    public static void main(String[] args) {
        //java: com.shujia.wyh.day13.ketang.Animal是抽象的; 无法实例化
//        Animal animal = new Animal();
        Animal a = new Dog();
        a.eat();
    }
}
